package si.unimb.engine;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.util.ArrayList;

import si.unimb.client.Client;

public class ClenKace extends GraficniObjekt implements KeyListener  {
	
	private ArrayList<Color> barve;
	private int hitrost_x;
	private int hitrost_y;
	private int hitrost;
	private int levo;
	private int desno;
	private int gor;
	private int dol;
	private boolean propustnost;
	private boolean obrnjeneTipke;
	private boolean stoji;
	Client c;
	Player p;
	
	public ClenKace(Client c, Player p, int pozicija_x, int pozicija_y, int sirina, int visina, int sirinaPolja, int visinaPolja, Image image, int gor, int dol, int levo, int desno) {	
		
		super(pozicija_x, pozicija_y, sirina, visina, sirinaPolja, visinaPolja, image);
		this.c = c;
		this.p = p;
		setHitrost(4);
		setHitrost_x(getHitrost());
		setHitrost_y(0);
		setPropustnost(false);
		setLevo(levo);
		setDesno(desno);
		setGor(gor);
		setDol(dol);
		setObrnjeneTipke(false);
		setStoji(false);
				
	}
	
	public ClenKace(Client c, Player p, int pozicija_x, int pozicija_y, int sirina, int visina, int sirinaPolja, int visinaPolja, Image image) {
		super(pozicija_x, pozicija_y, sirina, visina, sirinaPolja, visinaPolja, image);
		this.c = c;
		this.p = p;
		setHitrost(4);
		setHitrost_x(getHitrost());
		setHitrost_y(0);
		setPropustnost(false);
//		setLevo(levo);
//		setDesno(desno);
//		setGor(gor);
//		setDol(dol);
		setObrnjeneTipke(false);
		setStoji(false);
	}

	public void narisiClen(Graphics g, ImageObserver io) {
		
		//Izpis imena
		if(super.getPozicije().size() == 1)
			g.drawString(p.getName(), super.getPozicija_x(), super.getPozicija_y() - 10);
		
		if (super.isZivi()) {
			
//			for(int i = 0; i < super.getPozicije().size(); i++){
//				g.drawImage(super.getImage(), super.getPozicije().get(i).x, super.getPozicije().get(i).y, io);
//			}
			
			g.drawImage(super.getImage(), super.getPozicija_x(), super.getPozicija_y(), io);
			
//			premakni();
		} else {
			
			g.setColor(Color.RED);
			
			for(int i = 0; i < super.getPozicije().size(); i++){
				g.fillRect(super.getPozicije().get(i).x, super.getPozicije().get(i).y, super.getPozicije().get(i).width, super.getPozicije().get(i).height);
			}
			
			g.fillRect(super.getPozicija_x(), super.getPozicija_y(), super.getVisina(), super.getSirina());
		
		}
		
	}
	
	public void posljiPozicijo() {
		
		if (!seZabije(super.getPozicija_x() + hitrost_x, super.getPozicija_y() + hitrost_y)) {
			
//			super.setPozicija_x(super.getPozicija_x() + hitrost_x);
//			super.setPozicija_y(super.getPozicija_y() + hitrost_y);
//			getPozicije().add(new Rectangle(super.getPozicija_x(), super.getPozicija_y(), super.getSirina(), super.getVisina()));
			c.sendDataGameMode((short)p.getId(), (short)(super.getPozicija_x()+ hitrost_x), (short)(super.getPozicija_y()+ hitrost_y));
//			"#" + (super.getPozicija_x() + hitrost_x) + "." + (super.getPozicija_y() + hitrost_y));
			
		} else {
			setZivi(false);
			c.sendData("/dead");
		}
		
	}
	
	public void sprejmiPozicijo(int x, int y) {
		super.setPozicija_x(x);
		super.setPozicija_y(y);
		getPozicije().add(new Rectangle(super.getPozicija_x(), super.getPozicija_y(), super.getSirina(), super.getVisina()));
	}
	
	public boolean seZabije(int x, int y) {
		
		if (!isStoji()) {
			
			if (x  < 0 + 12) {
//				System.out.println("Zaletela se je1");
				return true;
			} else if (x > super.getSirinaPolja() - 16) {
//				System.out.println("Zaletela se je2");
				return true;
			} else if (y < 0 + 36) {
//				System.out.println("Zaletela se je3");
				return true;
			} else if (y > super.getVisinaPolja() - 16) {
//				System.out.println("Zaletela se je4");
				return true;
			}
			
			if (super.getPozicije().contains(new Rectangle(x, y, super.getSirina(), super.getVisina())) && isPropustnost() == false) {
				System.out.println("Zaletela se je v sebe");
				return true;
			}
			
		}
		
		return false;
		
	}
	
//	public void goUp(){
//		if(getHitrost_y() == 0){
//			setHitrost_x(0);
//			setHitrost_y(getHitrost_y() - getHitrost());
//		}
//	}
//	
//	public void goDown(){
//		if(getHitrost_y() == 0){
//			setHitrost_x(0);
//			setHitrost_y(getHitrost_y() + getHitrost());
//		}
//	}
//	
//	public void goLeft(){
//		if(getHitrost_x() == 0){
//			setHitrost_x(getHitrost_x() - getHitrost());
//			setHitrost_y(0);
//		}
//	}
//	
//	public void goRight(){
//		if(getHitrost_x() == 0){
//			setHitrost_x(getHitrost_x() + getHitrost());
//			setHitrost_y(0);
//		}
//	}
	
	public void keyPressed(KeyEvent e) {
		
		if (e.getKeyCode() == getGor()){   //Gor
			if(getHitrost_y() == 0){
				setHitrost_x(0);
				setHitrost_y(getHitrost_y() - getHitrost());
			}
//			c.sendData("#" + c.getNickname() + "." + "up");
//			goUp();
		}
		
		if (e.getKeyCode() == getDol()){   //Dol
			if(getHitrost_y() == 0){
				setHitrost_x(0);
				setHitrost_y(getHitrost_y() + getHitrost());
			}
//			c.sendData("#" + c.getNickname() + "." + "down");
//			goDown();
		}
					
		if (e.getKeyCode() == getLevo()){  //Levo
			if(getHitrost_x() == 0){
				setHitrost_x(getHitrost_x() - getHitrost());
				setHitrost_y(0);
			}
//			c.sendData("#" + c.getNickname() + "." + "left");
//			goLeft();
		}

		if (e.getKeyCode() == getDesno()){ //Desno
			if(getHitrost_x() == 0){
				setHitrost_x(getHitrost_x() + getHitrost());
				setHitrost_y(0);
			}
//			c.sendData("#" + c.getNickname() + "." + "right");
//			goRight();
		}
	}
	
	public void zamenjajTipke() {
		
		int zacasna;
		
		zacasna = getGor();
		setGor(getDol());
		setDol(zacasna);
		
		zacasna = getLevo();
		setLevo(getDesno());
		setDesno(zacasna);
		
		if (!obrnjeneTipke) {
			setObrnjeneTipke(true);	
		} else {
			setObrnjeneTipke(false);
		}
		
	}
	
	public void vrniVPrvotnoStanje() {
		
		setPropustnost(false);
		
		if (isObrnjeneTipke()) {
			zamenjajTipke();
		}
		
		setHitrost(4);
		
		if(getHitrost_y() > 0) {
			setHitrost_y(4);
		}
		
		if(getHitrost_x() > 0) {
			setHitrost_x(4);
		}
		
		if(getHitrost_y() < 0) {
			setHitrost_y(-4);
		}
		
		if(getHitrost_x() < 0) {
			setHitrost_x(-4);
		}
		
		
	}
	
	public void pohitritev() {
		
		setHitrost(8);
		
		if(getHitrost_y() > 0) {
			setHitrost_y(8);
		}
		
		if(getHitrost_x() > 0) {
			setHitrost_x(8);
		}
		
		if(getHitrost_y() < 0) {
			setHitrost_y(-8);
		}
		
		if(getHitrost_x() < 0) {
			setHitrost_x(-8);
		}
		
	}
	
	public void upocasnitev() {
		
		setHitrost(0);
		setStoji(true);
		
		if(getHitrost_y() > 0) {
			setHitrost_y(0);
		}
		
		if(getHitrost_x() > 0) {
			setHitrost_x(0);
		}
		
		if(getHitrost_y() < 0) {
			setHitrost_y(0);
		}
		
		if(getHitrost_x() < 0) {
			setHitrost_x(0);
		}
		
		
	}

	public void keyReleased(KeyEvent e) {
		
	}

	public void keyTyped(KeyEvent e) {
		
	}


	public ArrayList<Color> getBarve() {
		return barve;
	}

	public void setBarve(ArrayList<Color> barve) {
		this.barve = barve;
	}

	public void setHitrost_y(int hitrost_y) {
		this.hitrost_y = hitrost_y;
	}

	public int getLevo() {
		return levo;
	}

	public void setLevo(int levo) {
		this.levo = levo;
	}

	public int getDesno() {
		return desno;
	}

	public void setDesno(int desno) {
		this.desno = desno;
	}

	public int getGor() {
		return gor;
	}

	public void setGor(int gor) {
		this.gor = gor;
	}

	public int getDol() {
		return dol;
	}

	public void setDol(int dol) {
		this.dol = dol;
	}

	public int getHitrost_y() {
		return hitrost_y;
	}

	public void setHitrost_x(int hitrost_x) {
		this.hitrost_x = hitrost_x;
	}

	public int getHitrost_x() {
		return hitrost_x;
	}

	public boolean isPropustnost() {
		return propustnost;
	}

	public void setPropustnost(boolean propustnost) {
		this.propustnost = propustnost;
	}

	public void setHitrost(int hitrost) {
		this.hitrost = hitrost;
	}

	public int getHitrost() {
		return hitrost;
	}

	public void setObrnjeneTipke(boolean obrnjeneTipke) {
		this.obrnjeneTipke = obrnjeneTipke;
	}

	public boolean isObrnjeneTipke() {
		return obrnjeneTipke;
	}

	public void setStoji(boolean stoji) {
		this.stoji = stoji;
	}

	public boolean isStoji() {
		return stoji;
	}

}
